#include "setwig.h"
#include "ui_setwig.h"

#include "qcustomplot.h"

SetWig::SetWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SetWig)
{
    ui->setupUi(this);


    setupRealtimeDataDemo(ui->customPlot);
    ui->customPlot->replot();

    ui->checkBox_temp->setChecked(true);
    ui->checkBox_hui->setChecked(true);

    // 连接复选框信号与槽
        connect(ui->checkBox_temp, &QCheckBox::toggled, this, &SetWig::onCheckBoxToggled);
        connect(ui->checkBox_hui, &QCheckBox::toggled, this, &SetWig::onCheckBoxToggled);

}

SetWig::~SetWig()
{
    delete ui;

}

void SetWig::setupRealtimeDataDemo(QCustomPlot *customPlot)
{
    // 配置温度曲线（蓝色）
    customPlot->addGraph();
    customPlot->graph(0)->setPen(QPen(Qt::blue));
    customPlot->graph(0)->setName("温度");
    customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
    customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 6));

    // 配置湿度曲线（红色）
    customPlot->addGraph();
    customPlot->graph(1)->setPen(QPen(Qt::red));
    customPlot->graph(1)->setName("湿度");
    customPlot->graph(1)->setLineStyle(QCPGraph::lsLine);
    customPlot->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssSquare, 6));

    // 配置X轴为时间轴（支持高精度时间）
    QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
    dateTicker->setDateTimeFormat("yyyy-MM-dd hh:mm:ss");
    customPlot->xAxis->setTicker(dateTicker);
    dateTicker->setTickCount(5);
    customPlot->xAxis->ticker()->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);

    // 轴配置
    customPlot->xAxis->setLabel("时间");
    customPlot->yAxis->setLabel("数值");
    customPlot->axisRect()->setupFullAxesBox();
    customPlot->legend->setVisible(true);
    customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);

    // 初始化数据存储容器
    tempXData.clear();
    tempYData.clear();
    humXData.clear();
    humYData.clear();
}

// 解析JSON数据并更新到图表
void SetWig::parseJsonData(QByteArray jsonData)
{
    qDebug() << "历史数据处理";
    QJsonParseError parseError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError);

    if (parseError.error != QJsonParseError::NoError) {
        qDebug() << "[ERROR] JSON解析失败:" << parseError.errorString();
        return;
    }

    if (!jsonDoc.isObject()) {
        qDebug() << "[ERROR] JSON不是对象类型";
        return;
    }

    QJsonObject rootObj = jsonDoc.object();

    // 处理type=4的数据
    if (rootObj["type"].toInt() != 4) {
        return;
    }

    if (!rootObj.contains("data") || !rootObj["data"].isArray()) {
        qDebug() << "[ERROR] 缺少有效的data数组";
        return;
    }

    QJsonArray dataArray = rootObj["data"].toArray();
    int key = rootObj["key"].toInt();

    // 根据key值决定使用哪条曲线
    if (key == 104) {
        // 清空温度数据
        tempXData.clear();
        tempYData.clear();
        processDataArray(dataArray, tempXData, tempYData);
    }
    else if (key == 105) {
        // 清空湿度数据
        humXData.clear();
        humYData.clear();
        processDataArray(dataArray, humXData, humYData);
    }

    // 更新图表显示
    updatePlotWithJsonData();
}

// 处理数据数组的通用函数
void SetWig::processDataArray(const QJsonArray &dataArray, QVector<double> &xData, QVector<double> &yData)
{
    for (int i = 0; i < dataArray.size(); ++i) {
        QJsonObject item = dataArray[i].toObject();
        QString timeStr = item["time"].toString();
        QDateTime time = QDateTime::fromString(timeStr, "yyyy-MM-dd hh:mm:ss");

        if (!time.isValid()) {
            qDebug() << "[WARNING] 无效时间格式:" << timeStr;
            continue;
        }

        // 转换时间为毫秒级时间戳，提高精度
        xData.append(time.toMSecsSinceEpoch() / 1000.0);

        // 处理val值，增加错误检查
        bool ok;
        double val = item["val"].toString().toDouble(&ok);
        if (ok) {
            yData.append(val);
        } else {
            qDebug() << "[WARNING] 无效数值:" << item["val"].toString();
            // 可以添加默认值或跳过该数据点
            // yData.append(0); // 可选：添加默认值
        }
    }
}

// 用JSON数据更新图表
void SetWig::updatePlotWithJsonData()
{
    // 更新温度曲线
    ui->customPlot->graph(0)->data()->clear();
    if (!tempXData.isEmpty() && !tempYData.isEmpty()) {
        ui->customPlot->graph(0)->setData(tempXData, tempYData);
    }

    // 更新湿度曲线
    ui->customPlot->graph(1)->data()->clear();
    if (!humXData.isEmpty() && !humYData.isEmpty()) {
        ui->customPlot->graph(1)->setData(humXData, humYData);
    }

    // 根据复选框状态设置曲线可见性
    ui->customPlot->graph(0)->setVisible(ui->checkBox_temp->isChecked());
    ui->customPlot->graph(1)->setVisible(ui->checkBox_hui->isChecked());

    // 自动调整坐标轴范围
    if (ui->customPlot->graph(0)->visible() || ui->customPlot->graph(1)->visible()) {
        ui->customPlot->xAxis->rescale();
        ui->customPlot->yAxis->rescale();

        // 添加边距
        double xMargin = (ui->customPlot->xAxis->range().upper - ui->customPlot->xAxis->range().lower) * 0.1;
        double yMargin = (ui->customPlot->yAxis->range().upper - ui->customPlot->yAxis->range().lower) * 0.1;

        ui->customPlot->xAxis->setRange(
            ui->customPlot->xAxis->range().lower - xMargin,
            ui->customPlot->xAxis->range().upper + xMargin
        );

        ui->customPlot->yAxis->setRange(
            ui->customPlot->yAxis->range().lower - yMargin,
            ui->customPlot->yAxis->range().upper + yMargin
        );
    }

    // 重绘图表
    ui->customPlot->replot();
}

// 复选框状态变化处理
void SetWig::onCheckBoxToggled(bool checked)
{
    Q_UNUSED(checked);
    updatePlotWithJsonData();
}


/*----------------------发布主题处理------------------------*/
//功能：实现数据的下发
//参数：
//      @key：要设置的设备的key值
//      @val：要下发的设备的控制指令，如true\false
//      @topic：要发布的主题
//返回值 无
void SetWig::temHistoryDownSlot(QString key,QString topic,QString startTime,QString endTime ){

    // 创建内层 data 对象
    QJsonObject dataObj;
    dataObj["key"] = key;
    QJsonArray limitArray;
    limitArray.append(startTime);
    limitArray.append(endTime);
    dataObj["limit"] = limitArray;

    //创建外层数据
    QJsonObject jsonData;
    jsonData["type"] = "4";//4 历史查询类型
    jsonData["data"] = dataObj;



// 将 JSON 对象转换为 JSON 文档
    QJsonDocument jsonDoc(jsonData);
// 以紧凑格式将 JSON 文档转换为字节数组
    QByteArray payload = jsonDoc.toJson(QJsonDocument::Compact);

    //发布消息
    QMQTT::Message message;
    message.setTopic(topic);
    message.setPayload(payload);

    quint16 messageId = GlobalVal::mqtt->publish(message);
}

void SetWig::on_pushButton_clicked()
{
    qDebug()<<"----------------获取日期-------------------";
    QDateTime startDateTime = ui->dateTimeEdit->dateTime();
    QString startdate = startDateTime.toString("yyyy-MM-dd hh:mm:ss");
    qDebug()<<"starttime:"<<startdate;
    QDateTime endDateTime = ui->dateTimeEdit_2->dateTime();
    QString enddate = endDateTime.toString("yyyy-MM-dd hh:mm:ss");
    qDebug()<<"endtime:"<<enddate;

    temHistoryDownSlot("101","app/data/down",startdate,enddate);
}
